package com.nlx.notes.support.util;

import com.nlx.notes.module.bean.dto.file.excel.ZfbBillRecordDTO;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.FileHeader;
import org.apache.commons.csv.CSVRecord;

import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipException;

public class ZFBBillUtils {


    private static final Charset CSV_CHARSET = Charset.forName("GB18030");


//    public static List<AliPayRecord> parseZip(Path zipPath, String password) throws IOException {
//        Path tempDir = Files.createTempDirectory("alipay_zip_");
//        try {
//            // 解压（到临时目录）
//            unzipWithPassword(zipPath, tempDir, password);
//
//            // 找到 CSV 文件（通常只有一个）
//            List<Path> csvFiles;
//            try (var s = Files.walk(tempDir)) {
//                csvFiles = s.filter(p -> !Files.isDirectory(p) && p.getFileName().toString().toLowerCase().endsWith(".csv"))
//                        .collect(Collectors.toList());
//            }
//            if (csvFiles.isEmpty()) {
//                throw new FileNotFoundException("压缩包内未找到 CSV 文件。");
//            }
//
//            // 解析全部 CSV（如果多个则合并）
//            List<AliPayRecord> all = new ArrayList<>();
//            for (Path csv : csvFiles) {
//                all.addAll(parseCsv(csv));
//            }
//            return all;
//        } finally {
//            // 可选：保留临时目录便于排查；要自动清理可递归删除
//            // deleteRecursively(tempDir);
//        }
//    }

    public static String unzipWithPassword(Path zipPath, String destDir, String password) throws IOException {
        ZipFile zipFile = new ZipFile(zipPath.toFile());
        List<FileHeader> fileHeaders = zipFile.getFileHeaders();
        if (fileHeaders.isEmpty()) {
            System.out.println("ZIP 文件中没有文件。");
        } else {
            for (FileHeader fileHeader : fileHeaders) {
                System.out.println("文件: " + fileHeader.getFileName());
            }
        }
        if (zipFile.isEncrypted()) {
            zipFile.setPassword(password.toCharArray());
        }
        try {
            zipFile.extractAll(destDir);
            return zipFile.getFileHeaders().get(0).toString();
        } catch (IOException e) {
            System.err.println("IO 异常：" + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    public static List<ZfbBillRecordDTO> readCsv(String filePath){
        File file = new File(filePath);
        List<ZfbBillRecordDTO> records = new ArrayList<>();

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(file), CSV_CHARSET))) {

            String line;
            int index = 1;
            while ((line = reader.readLine()) != null) {
                // 跳过表头
                if (index <= 11) {
                    index++;
                    continue;
                }
                String[] columns = line.split(",", -1); // -1 允许空列
                if (columns.length >= 8) {
                    ZfbBillRecordDTO record = new ZfbBillRecordDTO(
                            columns[0], columns[1], columns[2], columns[3],
                            columns[4], columns[5], columns[6], columns[7]);
                    System.out.println("数据： "+record);
                    records.add(record);
                }
            }
            return records;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) throws IOException {
//        Path path = Paths.get("G:\\账单\\记账本明细记录_20250904203152.zip");
//        Path tempDir = Files.createTempDirectory("test");
//        unzipWithPassword(path,"G:\\账单\\test","710444");
//        readCsv();
    }

//    private static List<AliPayRecord> parseCsv(Path csvPath) throws IOException {
//        // 支付宝 CSV 通常前面有若干“说明行”，需要找到真正的表头行再解析
//        List<String> lines = Files.readAllLines(csvPath, CSV_CHARSET);
//        int headerIndex = findHeaderIndex(lines);
//
//        if (headerIndex < 0) {
//            throw new IOException("未找到表头行，无法解析：" + csvPath);
//        }
//
//        String headerLine = lines.get(headerIndex);
//        // 用 Commons CSV 解析（重新基于表头到末尾构建 Reader）
//        StringBuilder sb = new StringBuilder();
//        for (int i = headerIndex; i < lines.size(); i++) {
//            sb.append(lines.get(i)).append("\n");
//        }
//
//        try (Reader reader = new StringReader(sb.toString());
//             CSVParser parser = CSVParser.parse(reader, CSVFormat.DEFAULT
//                     .builder()
//                     .setHeader()              // 使用第一行作为表头
//                     .setSkipHeaderRecord(true)
//                     .setIgnoreEmptyLines(true)
//                     .setTrim(true)
//                     .build())) {
//
//            Map<String, String> headerMap = parser.getHeaderMap().keySet()
//                    .stream().collect(Collectors.toMap(k -> k, k -> k, (a,b)->a, LinkedHashMap::new));
//
//            return parser.getRecords().stream()
//                    .map(rec -> toRecord(rec, headerMap))
//                    .filter(Objects::nonNull)
//                    .collect(Collectors.toList());
//        }
//    }
//
//    /** 找到包含真实表头的行，一般会含有“交易创建时间/付款时间/交易时间”等关键列 */
//    private static int findHeaderIndex(List<String> lines) {
//        for (int i = 0; i < Math.min(lines.size(), 50); i++) {
//            String l = lines.get(i);
//            if (l.contains("交易创建时间") || l.contains("付款时间") || l.contains("交易时间")) {
//                // 进一步判断是否包含常见的其他列
//                if (l.contains("交易类型") || l.contains("收/支") || l.contains("金额")) {
//                    return i;
//                }
//            }
//        }
//        return -1;
//    }
//
//    private static AliPayRecord toRecord(CSVRecord r, Map<String, String> headerMap) {
//        try {
//            AliPayRecord ar = new AliPayRecord();
//
//            // 兼容不同导出模板的列名
//            String time = firstNonEmpty(r, "交易创建时间", "付款时间", "交易时间");
//            ar.tradeTime = parseDateTime(time);
//
//            ar.type = firstNonEmpty(r, "交易类型", "收/付款类型");
//            ar.counterparty = firstNonEmpty(r, "交易对方", "对方账号", "对方姓名");
//            ar.product = firstNonEmpty(r, "商品说明", "商品名称", "项目名称");
//
//            String inout = firstNonEmpty(r, "收/支", "收支");
//            ar.incomeOrExpense = inout;
//
//            String amt = firstNonEmpty(r, "金额（元）", "金额(元)", "金额");
//            ar.amount = parseAmount(amt, inout);
//
//            ar.status = firstNonEmpty(r, "交易状态", "当前状态", "状态");
//            ar.orderId = firstNonEmpty(r, "交易订单号", "支付宝交易号");
//            ar.merchantOrderNo = firstNonEmpty(r, "商家订单号", "商户订单号");
//            ar.remark = firstNonEmpty(r, "备注", "资金状态备注");
//
//            return ar;
//        } catch (Exception e) {
//            // 单行解析失败可以忽略或记录日志
//            return null;
//        }
//    }
//
//    private static String firstNonEmpty(CSVRecord r, String... keys) {
//        for (String k : keys) {
//            String v = safeGet(r, k);
//            if (v != null && !v.isBlank()) return v.trim();
//        }
//        return null;
//    }
//
//    private static String safeGet(CSVRecord r, String key) {
//        try {
//            return r.isMapped(key) ? r.get(key) : null;
//        } catch (IllegalArgumentException e) {
//            return null;
//        }
//    }
//
//    private static LocalDateTime parseDateTime(String s) {
//        if (s == null || s.isBlank()) return null;
//        for (DateTimeFormatter f : DATE_PATTERNS) {
//            try { return LocalDateTime.parse(s.trim(), f); } catch (Exception ignored) {}
//        }
//        // 有些模板“付款时间”只到日期，可根据需要改为 LocalDate
//        return null;
//    }
//
//    private static BigDecimal parseAmount(String s, String inout) {
//        if (s == null || s.isBlank()) return BigDecimal.ZERO;
//        String cleaned = s.replace(",", "").trim();
//        BigDecimal val = new BigDecimal(cleaned);
//        // 有的模板金额都是正数，靠“收/支”区分；支出转为负数更利于后续统计
//        if (inout != null && (inout.contains("支") || inout.equalsIgnoreCase("out"))) {
//            val = val.negate();
//        }
//        return val;
//    }
//
//    public static void deleteRecursively(Path root) {
//        if (root == null) return;
//        try {
//            if (Files.notExists(root)) return;
//            try (var s = Files.walk(root)) {
//                s.sorted(Comparator.reverseOrder()).forEach(p -> {
//                    try { Files.deleteIfExists(p); } catch (IOException ignored) {}
//                });
//            }
//        } catch (IOException ignored) {}
//    }


}
